package br.com.virtual.relatorio.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;

import br.com.virtual.base.controller.util.VirtualMB;
import br.com.virtual.base.model.VirtualModel;
import br.com.virtual.relatorio.model.Periodo;
import br.com.virtual.relatorio.model.Relatorio;
import br.com.virtual.relatorio.model.RelatorioPeriodo;
import br.com.virtual.relatorio.service.RelatorioService;

public abstract class RelatorioMB<T extends VirtualModel> extends VirtualMB {

	private static final long serialVersionUID = 1L;

	protected Periodo periodo;
	protected Relatorio<T> relatorio;
	
	protected List<String> periodos;
	
	
	public RelatorioMB(){
		
		this.periodo = new Periodo(null, null);
	}
	
	
	@PostConstruct @SuppressWarnings("unchecked")
	private void init(){
		

		Object objetoFlash = getFlash("relatorio");

		if( objetoFlash != null && objetoFlash instanceof Relatorio) {
			relatorio = (Relatorio<T>)objetoFlash;
			periodos = new ArrayList<String>(relatorio.getRelatorioPeriodos().keySet());			
		}
	}
	
	public void gerar(RelatorioService<T> relatorioService) {

		relatorio = relatorioService.generate(getPeriodo().getStart(), getPeriodo().getEnd());
		setFlash("relatorio", relatorio);
	}

	
	/*
	 * g & s
	 * */
	public Periodo getPeriodo() {
		return periodo;
	}

	public void setPeriodo(Periodo periodo) {
		this.periodo = periodo;
	}


	public Relatorio<T> getRelatorio() {
		return relatorio;
	}


	public void setRelatorio(Relatorio<T> relatorio) {
		this.relatorio = relatorio;
	}
		
	public String getMesAnoByPeriodo(String periodo){
		
		String [] periodos = periodo.split("-");
		return getMesByNumber(Integer.valueOf( periodos[1] )) + " de " + periodos[0];
	}
	
	public String getMesByNumber(int number){
		
		String[] meses = {	"Janeiro",
							"Fevereiro",
							"Março",
							"Abril",
							"Maio",
							"Junho",
							"Julho",
							"Agosto",
							"Setembro",
							"Outubro",
							"Novembro",
							"Dezembro"}; 
		
		if(number >= 0 && number <= 11)
			return meses[number];
		else
			return "";
	}
	
	public List<String> getPeriodos() {
		return periodos;
	}

	public void setPeriodos(List<String> periodos) {
		this.periodos = periodos;
	}

	
	public RelatorioPeriodo<T> getRelatorioPeriodo(String periodo){
		return this.relatorio.getRelatorioPeriodos().get(periodo);
	}
}
